from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


"""
等待：
    ①强制等待（不推荐，仅临时使用）：time.sleep
            ·说明：使用 time.sleep() 强制暂停脚本执行
            ·适用场景：临时调试、极简场景
            ·缺点：效率低下，无法适应动态加载
    ②隐式等待（全局等待）：
            ·说明：设置全局等待时间，适用于所有元素查找
            ·原理：当元素未立即找到时，轮询查找直到超时
    ③显示等待（推荐使用）
            ·说明：针对特定条件进行等待，灵活且高效
            ·核心组件：WebDriverWait：等待控制器
                     expected_conditions：预定义等待条件
            ·常用等待条件（expected_conditions）
                元素存在性检查：EC.presence_of_element_located((By.ID, "element_id"))
                元素可见性检查：EC.visibility_of_element_located((By.CSS_SELECTOR, ".loading"))
                元素可点击性检查：EC.element_to_be_clickable((By.XPATH, "//button[text()='提交']"))
                文本内容检查：EC.text_to_be_present_in_element((By.ID, "status"), "操作成功")
                框架切换检查：EC.frame_to_be_available_and_switch_to_it((By.NAME, "iframe1"))
                页面标题检查：EC.title_contains("后台管理系统")
                URL检查：EC.url_matches("https://.*/dashboard")
                多条件组合（Selenium 4+）
                    from selenium.webdriver.support.wait import AnyEC
                    # 等待元素可见 或 超时提示出现
                    WebDriverWait(driver, 10).until(
                        AnyEC(
                            EC.visibility_of_element_located((By.ID, "success")),
                            EC.visibility_of_element_located((By.ID, "error"))
                        )
                    )         
"""

driver = webdriver.Edge()
driver.get("https://www.baidu.com")

"""
# ① 强制等待
time.sleep(2)
"""

"""
# ② 隐式等待
# 只需设置一次，对整个 driver 生命周期有效
# 与显式等待混合使用时，以显式等待时间为准
driver.implicitly_wait(10)  # 单位：秒
# 后续所有的 find_element 操作都会最多等待 10 秒
element = driver.find_element(By.ID, "kw")
"""

# 显示等待（推荐使用）
element = WebDriverWait(driver, 15).until(
    # presence_of_element_located:元素存在于 DOM（可能隐藏）,只需确认元素已加载到页面结构
    # visibility_of_element_located:元素存在于 DOM 且可见（显示在页面上）,需要与元素交互（如点击、输入）
    EC.presence_of_element_located((By.ID, "kw"))
)

driver.quit()